Exemple CNC 10 : Programmation de trajectoires CNC dynamiques
Voir le CNC10_DynamicPath.project
exemple de projet dans le répertoire d'installation de CODESYS en dessous de ..\CODESYS SoftMotion\Examples
.
Cet exemple montre comment un chemin CNC peut être créé directement dans l'application au moment de l'exécution - sans être alimenté avec du code G à partir d'un objet de programme CNC ou d'un fichier. Lorsque ce type de programme CNC conventionnel est compilé, les données de chemin sont stockées dans un SMC_CNC_Data
type de structure de données. Ces données internes sont ensuite compilées dans des structures de données globales spécifiques selon le mode de compilation (SMC_CNC_REF ou SMC_OutQueue).
En mode compilation SMC_CNC_REF, les données sont stockées dans un tableau de SMC_GEOINFO
éléments. Le tableau dans le code de l'application est généralement transmis à l'instance du bloc fonction SMC_NCDecoder
. A l'exécution, les données y sont décodées et stockées dans une structure de données globale de type SMC_OUTQUEUE
. Ensuite, les blocs fonctionnels de prétraitement de chemin peuvent être appelés.
En mode compilation SMC_OutQueue, une structure de données globale (SMC_OUTQUEUE
) est généré directement. Cette structure de données dans le code de l'application est transmise à l'interpolateur (SMC_Interpolator
instance FB). Le bloc fonction SMC_NCDecoder
ne s'appelle pas.
En mode compilation DÉPOSER, les données sont stockées dans un fichier. Les données sont stockées sous la forme d'un tableau d'éléments de type SMC_GEOINFO
et correspondent aux données générées en mode compilation SMC_CNC_REF.
Au lieu de programmer le chemin CNC, vous pouvez programmer un code d'application qui instancie une structure de données de type SMC_OUTQUEUE
au moment de l'exécution et attribue ses valeurs. Vous programmez une trajectoire CNC qui est générée dynamiquement lors de l'exécution. Vous pouvez transmettre la structure de données à d'autres instances de blocs fonctionnels (par exemple aux blocs fonctionnels de prétraitement de chemin ou au bloc fonctionnel SMC_Interpolator
).
La programmation
Astuce
le CNCDynamicPath
exemple de projet se trouve dans le répertoire d'installation de CODESYS. L'exemple de projet a été élaboré à partir du CNConline
projet. Il comprend le Path
programme au lieu de la programmation graphique Example
chemin. Une structure de données de type SMC_OUTQUEUE
est généré dynamiquement.
Déclarer une structure de données de type
SMC_OUTQUEUE
. La structure de données contient les données de trajectoire CNC et est renseignée dynamiquement.Exemple:
QUEUE
Allouez de la mémoire pour le chemin avec la quantité requise pour
SMC_GEOINFO
éléments.Exemple:
BUF
Déclarer une variable de type
SMC_GEOINFO
avec une première étape.Exemple:
GEO
Un élément de tableau de type de données
SMC_GEOINFO
correspond à un élément de chemin dans le code CNC. Les étapes suivantes doivent être effectuées pour chaque élément afin d'ajouter l'élément auSMC_OUTQUEUE
:Chaque élément de tableau a une position de début qui correspond à la position de fin de l'élément de tableau précédent.
Exemple:
GEO.piStartPos.dX := 0;
ouGEO.piStartPos := GEO.piDestPos;
Déterminez un type de mouvement pour chaque élément du tableau.
Exemple:
GEO.iMoveType := CCLW;
ouGEO.iMoveType := LIN;
Définissez les paramètres du type de mouvement. Ceci n'est pas obligatoire pour tous les types de mouvement.
Exemple : Pour un arc (type de mouvement : CCLW), le réglage des positions suivantes est requis :
geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;
Insérez le calcul de la position finale.
SMC_CalcEndPnt(ADR(GEO));
Insérez le calcul de la longueur de l'objet.
SMC_CalcLengthGeo(ADR(GEO));
Enregistrez l'objet dans
QUEUE
:SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));
Lorsque le chemin est entièrement créé, les marqueurs de fin doivent être définis : QUEUE.bEndOfList := TRUE;
Astuce
Ensuite, lorsqu'un bloc fonction de prétraitement de chemin est appelé, il est nécessaire de définir le bit de début ou de fin pour InternMark
.
Chemin CNC avec deux éléments de chemin
Dans cet exemple, les tableaux ne sont pas définis avec les positions X/Y. S'il s'agissait d'un exemple avec deux éléments de chemin comme décrit, alors ces tableaux devraient avoir deux éléments chacun.
Par exemple, dérivé de l'exemple de projet :
xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path VAR iState : INT; QUEUE : SMC_OUTQUEUE; BUF : ARRAY[0..49] OF SMC_GEOINFO; // Memory allocation GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0); // Initial path element n : INT := 0; QUEUE.nSize := SIZEOF(BUF); END_VAR CASE iState OF 0: QUEUE.pbyBuffer := ADR(BUF[0]); // Initialize QUEUE SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF)); iState := iState + 1; 1: // Fill QUEUE WHILE NOT QUEUE.bFull DO // When QUEUE is full, wait until it has been processed by the following FBs n := n + 1; GEO.iSourceLine_No := n; GEO.piStartPos := GEO.piDestPos; // Copying last destination GEO.iMoveType := LIN; // Generating linear movement GEO.iObjNo := GEO.iObjNo + 1; // Calculating number GEO.piDestPos.dX := xp[n]; // Generatint position GEO.piDestPos.dY := yp[n]; SMC_CalcLengthGeo(pg := ADR(GEO)); // Calculating length of object with the help of the standard function SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO)); // Appending object to QUEUE IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN // All target positions processed QUEUE.bEndOfList := TRUE; n := 0; iState := 2; EXIT; END_IF END_WHILE 2: //Done ; END_CASE CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing
Important
Si la SMC_OUTQUEUE
la structure de données est remplie avec SMC_GEOINFO
data et l'élément de structure de données a été défini sur bFULL = TRUE
, alors nous ne recommandons pas une autre affectation de SMC_GEOINFO
Les données. Dans ce cas, la création du chemin est interrompue à l'exécution jusqu'à ce que le premier élément du SMC_OUTQUEUE
la structure des données est traitée dans l'interpolateur. Ce n'est qu'alors qu'un autre élément est inséré.
Évitez cette interruption en allouant suffisamment de mémoire. Voir variable BUF
.
Important
Si la structure de données SMC_OUTQUEUE
est rechargé après la première exécution, puis l'interpolateur et tous les blocs fonction de prétraitement (exemple : SMC_CheckVelocities
) doivent être redémarrés par un front montant à Execute
.